package com.wakaca.design.principle.dependenceinversion;

/**
 * Created by wakaca
 */
public class Test {

    //v1
    // 高层模块 Test 高度依赖 具体的 Wakaca 实现
//    public static void main(String[] args) {
//        Wakaca wakaca = new Wakaca();
//        wakaca.studyJavaCourse();
//        wakaca.studyFECourse();
//    }

    //v2
    // 我们要面向 ICourse 接口编程，我们写的扩展类是面向接口的，而不是面向具体的 Wakaca 实现类
    // 对于高层模块 Test，我们具体学习什么课程，是交给高层模块 Test 来选择的
    // 这样就做到了 Test 和 Wakaca 之间是解耦的，同时 Wakaca 和具体的课程实现是解耦的，但是
    // Wakaca 和 ICourse 接口是耦合的
    // 所谓的高内聚低耦合也就是说：尽量减少耦合，而因为有依赖关系，例如：Wakaca 依赖 ICourse，因为
    // ICourse 是 Wakaca#studyImoocCourse 方法的参数，所以他们之间是有关系的
    // 这里是通过接口方法的方式注入具体的实现，当然我们也可以通过构造器的方式来注入 Wakaca 具体 里面的实现
//    public static void main(String[] args) {
//        Wakaca wakaca = new Wakaca();
//        wakaca.studyImoocCourse(new JavaCourse());
//        wakaca.studyImoocCourse(new FECourse());
//        wakaca.studyImoocCourse(new PythonCourse());
//    }

    //v3
    // 通过构造器的方式来注入 Wakaca 具体 里面的实现
//    public static void main(String[] args) {
//        Wakaca wakaca = new Wakaca(new JavaCourse());
//        wakaca.studyImoocCourse();
//    }

    // 开放属性访问权限
    public static void main(String[] args) {

        Wakaca wakaca = new Wakaca();
        wakaca.setiCourse(new JavaCourse());
        wakaca.studyImoocCourse();

        wakaca.setiCourse(new FECourse());
        wakaca.studyImoocCourse();

    }

}
